---
title: Build lifecycle hooks
description: Learn how to use the EAS Build lifecycle hooks with npm to customize your build process.
maxHeadingDepth: 4
---

import { Collapsible } from '~/ui/components/Collapsible';
import { CODE } from '~/ui/components/Text';

EAS Build lifecycle npm hooks allows you to customize your build process by running scripts before or after the build process.

> For better understanding, see the [Android build process](/build-reference/android-builds/) and the [iOS build process](/build-reference/ios-builds/).

> **warning** The lifecycle hooks are not executed by the build process in [custom builds](/custom-builds/get-started/). They need to be manually extracted and called by the build steps during the process.

## EAS Build lifecycle hooks

There are six EAS Build lifecycle npm hooks available. To use, them, you can set them in your **package.json**.

| Build Lifecycle npm hook | Description                                                                                                                                                                                                                                                                                                                                    |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `eas-build-pre-install`  | Executed before EAS Build runs `npm install`.                                                                                                                                                                                                                                                                                                  |
| `eas-build-post-install` | The behavior depends on the platform and project type. <br/> <br/> For Android, runs once after the following commands have all completed: `npm install` and `npx expo prebuild` (if needed).<br/><br/> For iOS, runs once after the following commands have all completed: `npm install`, `npx expo prebuild` (if needed), and `pod install`. |
| `eas-build-on-success`   | This hook is triggered at the end of the build process if the build was successful.                                                                                                                                                                                                                                                            |
| `eas-build-on-error`     | This hook is triggered at the end of the build process if the build failed.                                                                                                                                                                                                                                                                    |
| `eas-build-on-complete`  | This hook is triggered at the end of the build process. You can check the build's status with the `EAS_BUILD_STATUS` environment variable. It's either `finished` or `errored`.                                                                                                                                                                |
| `eas-build-on-cancel`    | This hook is triggered if the build is canceled.                                                                                                                                                                                                                                                                                               |

An example of how a **package.json** can look when using one or more lifecycle hooks:

```json package.json
{
  "name": "my-app",
  "scripts": {
    "eas-build-pre-install": "echo 123",
    "eas-build-post-install": "echo 456",
    "eas-build-on-success": "echo 789",
    "eas-build-on-error": "echo 012",
    "eas-build-on-cancel": "echo 345",
    "start": "expo start",
    "test": "jest"
  },
  "dependencies": {
    "expo": "54.0.0"
    /* @hide ... */ /* @end */
  }
}
```

## Platform-specific hook behavior

To run a script (or some part of a script) only for Android or iOS builds, you can fork the behavior depending on the platform within the script. See the following common examples to do this through a shell script or a Node script.

### Examples

#### package.json and shell script

```json package.json
{
  "name": "my-app",
  "scripts": {
    "eas-build-pre-install": "./pre-install",
    "start": "expo start"
    /* @hide ... */ /* @end */
  },
  "dependencies": {
    /* @hide ... */
    /* @end */
  }
}
```

```bash pre-install
#!/bin/bash

# This is a file called "pre-install" in the root of the project

if [[ "$EAS_BUILD_PLATFORM" == "android" ]]; then
  echo "Run commands for Android builds here"
elif [[ "$EAS_BUILD_PLATFORM" == "ios" ]]; then
  echo "Run commands for iOS builds here"
fi
```

<Collapsible summary={<>Example: Pre-install script that installs <CODE>git-lfs</CODE> on macOS workers</>}>

The following script installs [`git-lfs`](https://git-lfs.com/) if it is not yet installed. This is useful in some cases where `git-lfs` is required to install certain CocoaPods.

```bash pre-install
if [[ "$EAS_BUILD_PLATFORM" == "ios" ]]; then
  if brew list git-lfs > /dev/null 2>&1; then
    echo "=====> git-lfs is already installed."
  else
    echo "=====> Installing git-lfs"
    HOMEBREW_NO_AUTO_UPDATE=1 brew install git-lfs
    git lfs install
  fi
fi
```

</Collapsible>

#### package.json and Node script

```json package.json
{
  "name": "my-app",
  "scripts": {
    "eas-build-pre-install": "node pre-install.js",
    "start": "expo start"
    // ...
  },
  "dependencies": {
    // ...
  }
}
```

```js pre-install.js
// Create a file called "pre-install.js" at the root of the project

if (process.env.EAS_BUILD_PLATFORM === 'android') {
  console.log('Run commands for Android builds here');
} else if (process.env.EAS_BUILD_PLATFORM === 'ios') {
  console.log('Run commands for iOS builds here');
}
```
